﻿==============================================================================
DOSYA ADI  : ReconnectSuspend.h
KAYNAK      : -GameServer\ReconnectSuspend.h
SISTEM      : v2369 Reconnect - SUNUCU
BOYUT       : 4705 bayt / 110 satir
ACIKLAMA    : SUSPENDED durum cekirdegi (CReconnectSuspend) - baslik dosyasi
==============================================================================

--- DOSYA ICERIGI ASAGIDAKI GIBIDIR ------------------------------------

#pragma once

// ============================================================================
//  Reconnect / SUSPENDED durum yönetimi (Sunucu tarafı)
// ----------------------------------------------------------------------------
//  /reconnecttest komutu ile tetiklenen "Yeniden Bağlanma" sisteminin durum
//  (state) çekirdeğidir. CUser'dan bağımsız tutulur; böylece askıya alma
//  süresi, kimlik doğrulaması ve paket filtresi tek bir yerde toplanır.
//
//  Yaşam döngüsü:
//      IN_GAME --Begin()--> SUSPENDED --Confirm()--> IN_GAME
//                                 |
//                                 +--IsExpired()--> disconnect / kurtarma
// ============================================================================

#include "../shared/globals.h"
#include <string>

namespace Reconnect
{
	// Askıdan çıkma (onay) işleminin sonucu.
	enum class SuspendResult : uint8
	{
		Confirmed = 0,				// "Yes" doğrulandı -> IN_GAME'e dön
		NotSuspended,				// aktif bir askı oturumu yok
		Expired,					// bekleme süresi doldu
		TokenMismatch,				// reconnect token uyuşmuyor
		AccountMismatch,			// hesap adı uyuşmuyor
		CharacterMismatch,			// karakter adı uyuşmuyor
		CharacterIDMismatch,		// oyun içi karakter ID uyuşmuyor
		SessionMismatch				// oturum (socket) uyuşmuyor
	};

	// Sonucun log için okunabilir karşılığı.
	const char* ToString(SuspendResult result);
}

// ----------------------------------------------------------------------------
//  Askıya alınan oturumun kimlik anlık görüntüsü (güvenlik doğrulaması için).
//  Begin() anında doldurulur; Confirm() gelen paketle karşılaştırır.
// ----------------------------------------------------------------------------
struct ReconnectIdentity
{
	std::string accountID;		// hesap adı  (GetAccountName)
	std::string characterName;	// karakter adı (GetName)
	uint16 characterID;			// oyun içi karakter ID (GetID)
	uint16 socketID;			// oturum ID (GetSocketID)
	uint32 token;				// reconnect token

	ReconnectIdentity() : characterID(0), socketID(0), token(0) {}

	// Kimlik doğrulaması yapılabilmesi için asgari alanlar dolu mu?
	bool IsUsable() const
	{
		return !accountID.empty() && !characterName.empty() && token != 0;
	}
};

// ----------------------------------------------------------------------------
//  SUSPENDED (askıya alınmış) oturum durumu.
//  Karakter oyunda kalır ancak işlevsizdir: yalnızca UI panelinden gelen
//  onay paketi işlenir (bkz. IsAllowedOpcode / IsAllowedXSafeSubOpcode).
// ----------------------------------------------------------------------------
class CReconnectSuspend
{
public:
	CReconnectSuspend();

	// --- Durum geçişleri ------------------------------------------------
	// Askıya alma işlemini başlatır (IN_GAME -> SUSPENDED).
	// Dönüş: true ise askı aktif hale geldi.
	bool Begin(uint8 holdSeconds, const ReconnectIdentity& identity);

	// Askıyı sonlandırır (SUSPENDED -> IN_GAME).
	// Kimlik doğrulaması YAPMAZ; kurtarma/iptal yollarında çağıran CUser'a güvenir.
	void Release(const char* reason);

	// UI panelinden gelen onay paketini doğrular. Başarılıysa askı biter ve
	// durum IN_GAME'e döner. Dönüş: SuspendResult::Confirmed ise başarılı.
	Reconnect::SuspendResult Confirm(const ReconnectIdentity& incoming,
		std::string& failReason);

	// --- Durum kontrolleri ----------------------------------------------
	bool IsActive() const { return m_active; }
	bool IsExpired() const;
	uint8 HoldSeconds() const { return m_holdSeconds; }
	uint32 ElapsedSeconds() const;
	uint32 RemainingSeconds() const;
	uint32 BeginTick() const { return m_beginTick; }
	uint32 Token() const { return m_identity.token; }
	uint32 ConfirmAttempts() const { return m_confirmAttempts; }
	const ReconnectIdentity& Identity() const { return m_identity; }
	const char* ReleaseReason() const { return m_releaseReason; }

	// --- Paket kapısı ----------------------------------------------------
	// SUSPENDED iken işlenmesine izin verilen ana opcode'lar.
	// Diğer tüm paketler (hareket, saldırı, yetenek, takas...) yutulur.
	static bool IsAllowedOpcode(uint8 opcode);

	// İzin verilen XSafe alt opcode'ları (UI panelinden gelen onay kanalı).
	static bool IsAllowedXSafeSubOpcode(uint8 subOpcode);

private:
	bool m_active;				// askı durumu aktif mi?
	uint8 m_holdSeconds;		// toplam bekleme süresi
	uint32 m_beginTick;			// askının başladığı tick
	uint32 m_confirmAttempts;	// doğrulama denemesi sayısı (teşhis)
	ReconnectIdentity m_identity;
	const char* m_releaseReason;
};